﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;
using FileUtils = System.IO.File;

namespace CppIDE.Core
{

    /// <summary>
    /// Egy fájlt reprezentál
    /// </summary>
    [Serializable]
    public class File
    {

        /// <summary>
        /// Konstruktor, létrehoz egy új fájl példányt (valódi fájlt nem készít),
        /// elérési út nélkül.
        /// </summary>
        public File()
        {
        }

        /// <summary>
        /// Konstruktor, létrehoz egy új fájl példányt (valódi fájlt nem készít),
        /// elérési úttal.
        /// </summary>
        /// <param name="fullPath">A teljes elérési út</param>
        public File(String fullPath)
        {
            FullPath = fullPath;
        }

        /// <summary>
        /// A fájl teljes elérési útja
        /// </summary>
        private String fullPath = null;

        /// <summary>
        /// Az elérési út tulajdonság.
        /// Kétszer nem lehet beállítani, mert nem változhat.
        /// </summary>
        /// <value>A fájl teljes elérési útja</value>
        [XmlAttribute]
        public String FullPath
        {
            get
            {
                return fullPath;
            }
            set
            {
                if (fullPath != null)
                {
                    throw new Exception("FullPath already set");
                }
                fullPath = value.Replace("/", "\\");
            }
        }

        /// <summary>
        /// Egyenlőséget ellenőriz: akkor egyenlő két fájl, ha ugyanaz az elérési útjuk.
        /// </summary>
        /// <param name="obj">A másik fájl</param>
        /// <returns>igaz, ha egyenlőek</returns>
        public override bool Equals(Object obj)
        {
            if (obj == null)
            {
                return false;
            }

            File file = obj as File;
            if ((Object)file == null)
            {
                return false;
            }

            return file.fullPath == fullPath;
        }

        /// <summary>
        /// Visszatér egy hashcode-al. Hasított adatszerkezetek optimális működéséhez
        /// van rá szükség.
        /// </summary>
        /// <returns>hashCode</returns>
        public override int GetHashCode()
        {
            return fullPath.GetHashCode();
        }

        /// <summary>
        /// A fájl név része, nem módosítható.
        /// Példa: c:\windows\explorer.exe esetén explorer.exe
        /// </summary>
        /// <value>A fájl név része</value>
        public String Name
        {
            get
            {
                string[] parts = fullPath.Split('\\');
                if (parts.Length == 0)
                {
                    throw new Exception("Not a valid absolute path!");
                }
                else
                {
                    return parts[parts.Length - 1];
                }
            }
        }

        /// <summary>
        /// A fájl név nélküli része, azaz a tartalmazó könyvár elérési útja.
        /// </summary>
        /// <value>A fájl név nélküli része, azaz a tartalmazó könyvár elérési útja.</value>
        public String ParentPath
        {
            get
            {
                int slashPosition = FullPath.LastIndexOf('\\');
                if (slashPosition == -1)
                {
                    throw new Exception("Not a valid absolute path!");
                }
                else
                {
                    return FullPath.Substring(0, slashPosition);
                }
            }
        }

        /// <summary>
        /// Törli a fájlt, ha nem megy, akkor nem ad hibaüzenetet.
        /// </summary>
        public void Delete()
        {
            try
            {
                FileUtils.Delete(FullPath);
            }
            catch (Exception)
            {
            }
        }

        /// <summary>
        /// Létezik-e a fájl? Nem változtatható tulajdonság.
        /// </summary>
        /// <value>A fájl létezése</value>
        public bool Exist
        {
            get
            {
                return FileUtils.Exists(FullPath);
            }
        }

        /// <summary>
        /// Az utolsó változtatás dátuma. Nem változtatható tulajdonság.
        /// </summary>
        /// <value>A fájl utolsó változtatásának dátuma.</value>
        public DateTime LastModification
        {
            get
            {
                return FileUtils.GetLastWriteTime(FullPath);
            }
        }

    }

}
